<?php

//print_r($_FILES);
//print_r($_SERVER);

    $s = $_GET['s']??'';
    if($s==''){
		die(getFailureJson('s参数不能为空'));
	}
	
	
	
	$jsonfileInfo = $_POST['jsonfileInfo'];

	$file_info = json_decode($jsonfileInfo,true);
	$md5 = $file_info['md5'];
	$size = $file_info['size'];
	if($md5){
		$inner_dir = $md5.'_'.$size;
	}else{
		$inner_dir = md5($file_info['name']).'_'.$size;
	}
	$each_cut_len = $file_info['each_cut_len'];
	
	
	//检查是否有同名文件，如果有同名文件，大小是否相同，如果相同则提示文件已存在
	$targetFile = dirname(__FILE__)."/files".'/'.$s.'/'.$file_info['name'];
	if (file_exists($targetFile)) {
		if(filesize($targetFile)==$size){
			die(getFailureJson('文件已存在'));
		}
	}
	
    //获取当前文件所在的绝对目录
    $dir =  dirname(__FILE__)."/temp_files".'/'.$s.'/'.$inner_dir;
    //files
    mkdirs($dir);
	
	$info_file_name = 'info.txt';
	
	file_put_contents($dir.'/'.$info_file_name,json_encode($_POST));
	
	//这里新建一个占位文件(不存在则新建)
	$outputFile = $dir.'/'.'temp_'.$file_info['name'];
	//if(!file_exists($outputFile)){
	//	createFileOfSize($outputFile, $size);
	//}
	
	//计算文件个数
	$file_num = ceil($size/$each_cut_len);
	
	$file_name_key_check_arr = [];
	for($i=0;$i<$file_num;$i++){
		$file_name_key_check_arr[$i]=0;
	}
	
	$temp_file_arr = [];
	$files = scandir($dir);  // 获取文件夹下所有文件和文件夹
	foreach ($files as $file) {
		if (is_numeric($file)) {  // 排除当前目录和上层目录
			$temp_file_arr[]=$file;
			if(isset($file_name_key_check_arr[$file])){
				$file_name_key_check_arr[$file]=1;
			}
		}
	}
	
	$exist_file_name_arr = [];
	$not_exist_file_name_arr = [];
	foreach($file_name_key_check_arr as $file => $exist ){
		if($exist){
			$exist_file_name_arr[]=$file;
		}else{
			$not_exist_file_name_arr[]=$file;
		}
	}
	
	
	//所有文件都上传完毕，则把文件移动到对应目录
	if(count($not_exist_file_name_arr)==0){
		$outputFile = $dir.'/'.'temp_'.$file_info['name'];
		$targetDir = dirname(__FILE__)."/files".'/'.$s;
		mkdirs($targetDir);
		$targetFile = $targetDir.'/'.$file_info['name'];
		if (rename($outputFile, $targetFile)) {
			//echo "文件移动成功".$targetFile;
		} else {
			die(getFailureJson('文件移动失败',-1,[
				'outputFile'=>$outputFile,
				'targetFile'=>$targetFile,
			]));
		}
		try {
			deleteDirectory($dir);
		} catch (InvalidArgumentException $e) {
			echo "Error: " . $e->getMessage();
		} catch (RuntimeException $e) {
			echo "Error: " . $e->getMessage();
		}
	}
	
	/*
	//如果所有的文件都上传完毕了，则开始合并文件
	if(count($not_exist_file_name_arr)==0){
		//print_r(['exist_file_name_arr'=>$exist_file_name_arr,'not_exist_file_name_arr'=>$not_exist_file_name_arr]);
		// 要合并的文件列表
		 
		// 输出文件
		$outputFile = $dir.'/'.$file_info['name'];
		 
		// 打开输出文件准备写入
		$fp = fopen($outputFile, 'wb');
		 
		// 遍历所有文件，并将它们的内容写入输出文件
		foreach ($exist_file_name_arr as $file) {
			if (file_exists($dir.'/'.$file)) {
				$content = file_get_contents($dir.'/'.$file);
				fwrite($fp, $content);
			}
		}
		 
		// 关闭文件句柄
		fclose($fp);
		
		//计算合并后的文件的md5
		$md5outputFile = md5_file($outputFile);
		if($md5!='' && $md5outputFile!=$md5){
			die(getFailureJson('合并后的文件md5校验失败',-1,[
				'md5outputFile'=>$md5outputFile,
				'md5'=>$md5,
				'name'=>$file_info['name'],
			]));
		}
		$targetFile = dirname(__FILE__)."/files".'/'.$s.'/'.$file_info['name'];
		
		if (rename($outputFile, $targetFile)) {
			//echo "文件移动成功".$targetFile;
		} else {
			die(getFailureJson('文件移动失败',-1,[
				'outputFile'=>$outputFile,
				'targetFile'=>$targetFile,
			]));
		}
		foreach ($exist_file_name_arr as $file) {
			//if (file_exists($dir.'/'.$file)) {
				//unlink($dir.'/'.$file);
			//}
		}
		
		
		try {
			deleteDirectory($dir);
		} catch (InvalidArgumentException $e) {
			echo "Error: " . $e->getMessage();
		} catch (RuntimeException $e) {
			echo "Error: " . $e->getMessage();
		}
	}
	*/
	
	die(getSuccessJson('请求成功',[
		'need_upload_arr'=>$not_exist_file_name_arr,
		'exist_arr'=>$exist_file_name_arr,
	]));
	
	//print_r([$_GET,$_POST]);
	//print_r($_POST);
	
	

function mkdirs($dir, $mode = 0777)
 {
     if (is_dir($dir) || @mkdir($dir, $mode)) return TRUE;
     if (!mkdirs(dirname($dir), $mode)) return FALSE;
     return @mkdir($dir, $mode);
 } 
 
 function deleteDirectory($dirPath) {
    // 检查目录是否存在
    if (!is_dir($dirPath)) {
        throw new InvalidArgumentException("$dirPath is not a directory");
    }

    // 打开目录并遍历其中的内容
    $items = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dirPath, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::CHILD_FIRST
    );

    foreach ($items as $item) {
        // 如果是文件，则删除文件
        if ($item->isDir()) {
            rmdir($item->getRealPath());
        } else {
            unlink($item->getRealPath());
        }
    }

    // 尝试删除目录本身
    if (!rmdir($dirPath)) {
        throw new RuntimeException("Failed to remove directory $dirPath");
    }

}


function createFileOfSize($filename, $filesize) {
	
	$each_len =  10 * 1024 * 1024;//分段写入的字节数，暂时设定为3MB，防止内存占用过多
	$fileSizeRemain = $filesize;
	
	// 打开输出文件准备写入
	$fp = fopen($filename, 'wb');
	$content = '';
	while($fileSizeRemain>0){
		$writeLen = $each_len;
		if($fileSizeRemain<$each_len){
			$writeLen = $fileSizeRemain;
		}
		
		// 如果字符串长度不等于要写入的长度，则生成字符串
		if(strlen($content)!=$writeLen){
			$content = str_repeat("0", $writeLen); // 这里使用"0"填充文件，可以根据需要修改
		}
		
		fwrite($fp, $content);
		
		$fileSizeRemain = $fileSizeRemain - $writeLen;
	}
	
	// 关闭文件句柄
	fclose($fp);
	
}
 

 
     function getJson($params)
    {
        return json_encode($params,JSON_UNESCAPED_UNICODE);
    }

    function getSuccessJson($msg='请求成功',$data=[],$code=1)
    {
        return getJson([
            'msg'=>$msg,
            'code'=>$code,
            'data'=>$data,
        ]);
    }

    function getFailureJson($msg='请求失败',$code=-1,$data=[])
    {
        return getJson([
            'msg'=>$msg,
            'code'=>$code,
            'data'=>$data,
        ]);
    }
 
 